#!/bin/bash

CA_DIR=${CA_DIR:-/opt/certmgr/defaultCA}
CERT_DIR=${CERT_DIR:-/opt/certmgr/certs}

# 初始化配置，包括自定义CA目录结构
function init_config() {
  if [ -d "${CA_DIR}" ]; then
    return
  fi

  mkdir -p "${CA_DIR}"
  cd "${CA_DIR}"
  mkdir private/ newcerts/
  touch index.txt
  touch serial
  echo 00 > serial
}

# 初始化CA证书
function init_ca() {
  # 生成根密钥
  cd ${CA_DIR}/private/
  openssl genrsa -out cakey.pem 3072

  # 生成证书请求
  openssl req -new -key cakey.pem -out ca.csr -subj "/C=CN/O=CAorganization/CN=myRootCA"

  # 签发根证书
  openssl x509 -req -days 3650 -sha256 -extensions v3_ca -signkey cakey.pem -in ca.csr -out cacert.pem

  # 将根证书移动到与openssl.cnf配置文件要求的一致目录下
  mv cacert.pem ../
  rm -rf ca.csr
}

# 生成证书，包括证书秘钥和证书
# 参数：
#  dn：签发对象
#
#
function generate_certificate() {
  [ ! -d "${CERT_DIR}" ] && mkdir -p "${CERT_DIR}"
  cd "${CERT_DIR}"
  openssl genrsa -out server.key 3072
  openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myserver.test.com"
  openssl ca -in server.csr -days 365 -out server.crt
}

# 通过证书请求生成证书
function generate_certificate_by_csr() {
  [ ! -d "${CERT_DIR}" ] && mkdir -p "${CERT_DIR}"
  cd "${CERT_DIR}"
  return
}

init_config
init_ca
generate_certificate
